package com.cawring.simple.result.impl;

import java.io.IOException;
import java.io.Writer;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cawring.simple.result.Model;
import com.cawring.simple.result.Result;
import com.cawring.simple.result.ViewResult;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * 
 * <pre>
 * 클래스명 : HTML 렌터링
 * 패키지명 : com.cawring.simple.result.impl
 * 파일명   : HtmlResult.java
 * 설명     :
 * freemarker로 화면을 제공한다.
 * </pre>
 * @Author    : 백승건
 * @Date      : 2014. 3. 13.
 * @Version   : v.1.0.0 - 2014. 3. 13. 최초작성
 */
public class HtmlResult implements ViewResult
{
	/* logger */
	private static final Logger log = Logger.getLogger(HtmlResult.class.getName());
	
	/* VIEW 파일 확장자 */
	private static final String URL_EXT = ".ftl.html";
	
	/* VIEW 파일경로  */
	private String path;
	
	/* Model */
	private Model model;
	
	/* request */
	private HttpServletRequest request;
	
	/* response */
	private HttpServletResponse response;
	
	/**
	 * <pre>
	 * 메소드명     : 생성자 메소드
	 * 메소드작성일 : 2014. 3. 13.
	 * 메소드설명   :
	 * 생성시, 인스턴스 변수를 초기화 한다.
	 * </pre>
	 */
	public HtmlResult(String path, Model model, HttpServletRequest req, HttpServletResponse res)
	{
		this.path     = path;
		this.model    = model;
		this.request  = req;
		this.response = res;
	}
	
	/**
	 * <pre>
	 * 메소드명     : html Render
	 * 메소드작성일 : 2014. 3. 13.
	 * 메소드설명   :
	 * freemarker로 결과값을 브라우저에 보여준다.
	 * </pre>
	 */
	public Result render()
	{
		/* request 정보 호출 */
		log.info(request.toString());
		
		/* freemarker configuration */
		Configuration cfg = new Configuration();
		
		/* freemarker path */
		String   ftlPath = null;
		
		try
		{
			/* template call */
			ftlPath  = appendExt(path);
			Template template = cfg.getTemplate(ftlPath);
			
			/* write */
			Writer out = response.getWriter();
			
			/* freemaker call */
			template.process(model.getAll(), out);
		}
		catch (IOException e)
		{
			log.severe(ftlPath+" 해당 파일을 찾을 수 없습니다.");
		}
		catch (TemplateException e)
		{
			log.severe(ftlPath+" 해당 파일에 문제가 발생했습니다.");
		}
		
		return new Result();
	}
	
	/**
	 * 
	 * <pre>
	 * 메소드명     : VIEW 파일 확장자 붙이기
	 * 메소드작성일 : 2014. 3. 13.
	 * 메소드설명   : 메스드 설명을 작성한다.
	 * </pre>
	 * @param path : 파일경로및파일명 - base/index
	 * @return 확장자 붙임 - base/index.ftl.html
	 */
	private String appendExt(String path)
	{
		return path+URL_EXT;
	}
}
